使用xinetd管理网络应用服务

        默认机器没有安装这个服务,需要安装

1
yum install -y xinetd

        随着互联网的不断发展以及Linux系统的不断完善,以Linux为系统核心的网络服务器的比重正在逐年上升。从WWW服务器到目前流行的游戏服务器,绝大多数都在采用Linux作为服务平台。正是由于各种应用的不断出现和用户群的增长,基于Linux的系统应当拥有完善的安全措施,应当足够坚固、能够抵抗来自Internet的侵袭,这也正是Linux之所以流行并且成为Internet骨干力量的主要原因。一方面,Linux为用户提供了多种优质的网络服务,包括Http、Ftp、Smtp、Pop3等;另一方面,服务的增多意味着更多的风险。每种服务本身都必然存在着某些缺陷,而这些缺陷很有可能被高明的黑客利用来对系统进行攻击。所以,提供特定服务的服务器应该尽可能开放提供服务必不可少的端口,而将与服务器服务无关的服务关闭,比如:一台作为www和ftp服务器的机器,应该只开放80和25端口,而将其他无关的服务如关掉,以减少系统漏洞。本专题将着重讲述在Linux系统中如何使用xinetd机制来管理网络应用服务。

Xinetd机制介绍

        在Linux系统的早期版本中,有一种称为inetd的网络服务管理程序,也叫作“超级服务器”,就是监视一些网络请求的守护进程,其根据网络请求来调用相应的服务进程来处理连接请求。inetd.conf则是inetd的配置文件。inetd.conf文件告诉inetd监听哪些网络端口,为每个端口启动哪个服务。在任何的网络环境中使用Linux系统,第一件要做的事就是了解一下服务器到底要提供哪些服务。不需要的那些服务应该被禁止掉,这样黑客就少了一些攻击系统的机会,因为服务越多,意味着遭受攻击的风险越打。用户可以查看“/etc/inetd.conf”文件,了解一下inetd提供和开放了哪些服务,以根据实际情况进行相应的处理。而在Linux7.X的版本当中则使用xinetd(扩展的超级服务器)的概念对inetd进行了扩展和替代。因此本专题主要以xinetd为背景,来讲述如何增加和删除网络服务,从而有效地保证Linux系统安全。
        xinetd的默认配置文件是/etc/xinetd.conf。其语法和/etc/inetd.conf完全不同且不兼容。它本质上是/etc/inetd.conf和/etc/hosts.allow,/etc/hosts.deny功能的组合。
系统默认使用xinetd的服务可以分为如下几类:

  • 标准internet服务:http、telnet、ftp等;
  • 信息服务:finger、netstat、systat;
  • 邮件服务:imap、pop3、smtp;
  • RPC服务:rquotad 、rstatd、rusersd、sprayd、walld;
  • BSD服务:comsat、exec、login、ntalk、shell talk;
  • 内部服务:chargen、daytime、echo等;
  • 安全服务:irc;
  • 其他服务:name、tftp、uucp、wu-ftp;

        上述xinetd提供的服务的用途以及使用方法,用户可以查找相关的资料获得,这里不再赘述。然而,对他们有详细地了解是必不可少的,这可以帮助用户较好地确定需要或者不需要哪些网络服务功能。

        下面是一个典型的/etc/xinetd.conf文件的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# vi xinetd.conf
#
# Simple configuration file for xinetd
#
# Some defaults, and include /etc/xinetd.d/
defaults
{
instances = 60
log_type = SYSLOG authpriv
log_on_success = HOST PID
log_on_failure = HOST
cps = 25 30
}
includedir /etc/xinetd.d

        从文件最后一行可以清楚地看到,/etc/xinetd.d目录是存放各项网络服务(包括http、ftp等)的核心目录,因而系统管理员需要对其中的配置文件进行熟悉和了解。
一般说来,在/etc/xinetd.d的各个网络服务配置文件中,每一项具有下列形式:

1
2
3
4
5
6
7
8
9
10
service service-name
{
Disabled //表明是否禁用该服务
Flags //可重用标志
Socket_type //TCP/IP数据流的类型,包括stream,datagram,raw等
Wait //是否阻塞服务,即单线程或多线程
User //服务进程的uid
Server //服务器守护进程的完整路径
log_on_failure //登陆错误日志记录
}

        其中service是必需的关键字,且属性表必须用大括号括起来。每一项都定义了由service-name定义的服务。
        Service-name是任意的,但通常是标准网络服务名,也可增加其他非标准的服务,只要它们能通过网络请求激活,包括localhost自身发出的网络请求。
        每一个service有很多可以使用的attribute,操作符可以是=,+=,或-=。所有属性可以使用=,其作用是分配一个或多个值,某些属性可以使用+=或-=的形式,其作用分别是将其值增加到某个现存的值表中,或将其值从现存值表中删除。
        用户应该特别注意的是:每一项用户想新添加的网络服务描述既可以追加到现有的/etc/xinetd.conf中,也可以在/etc/xinetd.conf中指定的目录中分别建立单独的文件,RedHat 7.x以上的版本都建议采用后一种做法,因为这样做的可扩充性很好,管理起来也比较方便,用户只需要添加相应服务的描述信息即可追加新的网络服务。
        RedHat 7.x默认的服务配置文件目录是/etc/xinetd.d,在该目录中使用如下命令可以看到许多系统提供的服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#cd /etc/xinetd.d
#ls
chargen cvspserver daytime-udp echo-udp ntalk qmail-pop3 rexec rsh sgi_fam telnet time-udp chargen-udp daytime echo finger pop3 qmail-smtp rlogin rsync talk time wu-ftpd
然而,上述的许多服务,默认都是关闭的,看看如下文件内容:
#cat telnet
# default: off //表明默认该服务是关闭的
# description: The telnet server serves telnet sessions; it uses \
# unencrypted username/password pairs for authentication.
service telnet
{
disable = yes //表明默认该服务是关闭的
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID

服务的开启与关闭

        一般说来,用户可以使用两种办法来对网络服务进行开启与关闭。一种为通过文件直接编写进行开启与关闭;另外一种则通过用户熟悉的图形用户界面进行。下面分别进行介绍。

1.使用/etc/xinetd.d目录下的文件进行配置

        针对上面列出的关于telnet的例子,用户想要开启服务,只需要通过使用vi 编辑器改写该文件为如下内容:

1
2
3
4
5
6
7
8
9
10
service telnet
{
disable = no //将该域置为“no”,则表明开启该服务
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
}

        然后,需要使用/etc/rc.d/init.d/xinetd restart来激活Telnet服务即可。
        相对应的,如果用户想要关闭某个不需要的服务,则将上述的disable = no改为disable = yes即可,这样就修改了服务配置,并且再次使用/etc/rc.d/init.d/xinetd restart来启用最新的配置。
        这种方法使用起来相对于Windows下的图形配置方法较为复杂,用户需要对其中的每个参数都有清楚地了解,不能够随意修改,所以建议高级用户或者是有经验的用户使用。

2.使用图形用户界面进行配置:

        用户可以在终端下键入“setup”命令来对系统提供的服务、防火墙配置、用户授权配置、网络配置、声卡配置、打印机配置等进行全方位的配置。
        用户选择其中的System services进行配置即可.
        用户将会看到系统罗列出了anacron,apmd,autofs,chargen,telnet,http等包括我们上面所讲述的xinetd管理的网络服务在内的系统服务进程,用户通过选择这些进程,则可以开启相应的服务。而如果用户想关掉其中的某个服务,则取消选择,保存退出即可以完成配置。
        而用户这样设置的结果,就相当于直接对/etc/xinetd.d相应网络服务的配置文件进行了改写,只不过使用起来更加直观和方便,且不需要用户具有比较熟练的Linux使用技巧。
        同样需要注意的是,在配置好了相应的网络服务之后,需要执行/etc/rc.d/init.d/xinetd restart命令来对新的改动进行激活,那么就能够使用最新配置的服务了。
        最后强调用户注意的是,本文给出的使用方法使用效率的高低、正确与否,极大程度上取决于具体的应用,以及用户对各项服务理解程度的不同。希望用户在配置自己的Linux服务器之前,对各种应用服务都作深入地了解,待到根据实际的应用需求确定好需要开启和哪些网络服务之后再使用xinetd机制进行配置,切忌稀里糊涂地进行配置,反而导致产生较大的漏洞和风险。